#ifndef __FILE_COMMAND__
#define __FILE_COMMAND__
#include "head.h"
#include "dataBase.h"
#include "fileCheck.h"
#define MAX_TRANS_ELEM_NUM 500  // 最大传输文件个数
typedef enum {
    DIR_CATEGORY,
    FILE_CATEGORY
} DirCategory;

// 传回给客户端的内容
typedef struct fileElem_s {
    char dir_name[50];          // 目录名
    DirCategory dir_category;   // 是目录还是文件
    int dir_size;               // 目录/文件的字节数
    time_t last_modify_time;    // 最后修改时间
} fileElem_t;

typedef struct fileList_s {
    fileElem_t file_elem[MAX_TRANS_ELEM_NUM];   // 传输文件项
    int file_number;            // 传输文件个数
}fileList_t;

typedef struct filePath_s {
    int current_file_id;    // 当前文件id
    int current_user_id;    // 当前用户id
} filePath_t;

/**
 * 接口函数
 * cd - 修改current_file_id
 */
int lsCommand(filePath_t* file_path,MYSQL* mysql,fileList_t* file_list);
int cdCommand(filePath_t* file_path,MYSQL* mysql,const char* cd_path);
int pwdCommand(filePath_t* file_path,MYSQL* mysql,char** pwd_string);
int mkdirCommand(filePath_t* file_path,MYSQL* mysql,const char* dir_path);
int rmdirCommand(filePath_t* file_path,MYSQL* mysql,const char* rm_dir_path);
int removeCommand(filePath_t* file_path,MYSQL* mysql,const char* rm_file_path);
/**
 * 文件上传
 */
int touchCommand(filePath_t* file_path,MYSQL* mysql,const char* file_name,const char* hash_name,const int file_size);
// 
// 方法函数
/**
 * 1. 处理路径字符串 - 获取最后的目录或文件id
 * 2. 生成文件hash字符串
 * 3. 判断文件是否可以恢复
 */
int doStringTokenPath(filePath_t* file_path,MYSQL * mysql,const char* path);

int hashSha256(int file_fd,char* hash_name);

int canBeRestored(MYSQL* mysql,const char* file_name,const int file_id,const int user_id,const char file_category);

// 文件传输函数
/**
 * 1. 判断文件是否存在
 * 2. 判断文件是否是完整文件
 * 3. 修改文件状态为完整文件
 * 4. 插入临时文件
 * 5. 插入完整文件
 */
int isFileExist(MYSQL* mysql,const char* hash_name);
int isFileCompleted(MYSQL* mysql,filePath_t file_path,const char* file_name);
int updateFileCompleted(MYSQL* mysql,filePath_t file_path,const char* file_name,const char* new_hash_name);

int insertTempFileElem(MYSQL* mysql,filePath_t file_path,const char* file_name,const int file_size,const char* file_hash);
int insertCompFileElem(MYSQL* mysql,filePath_t file_path,const char* file_name,const int file_size,const char* file_hash);

// 给出当前文件名file_name, 其它信息由sha256查表得到
int insertFileSkip(MYSQL *mysql,filePath_t file_path, const char *file_name, const char *sha256);

// 必要的信息在 file_check 中获取
int insertFileNew(MYSQL *mysql,filePath_t file_path, const fileCheck_t *file_check);

int deleteFile(MYSQL* mysql,filePath_t file_content,const char* file_name);


// 查询请求下载的文件是否存在
// 存在返回 FILE_EXIST
// 不存在返回 FILE_NOT_EXIST
int checkFileExist(MYSQL *mysql,filePath_t file_desc, const char *file_name, const char *file_path);
// 上传时查询网盘文件状态
int isFileResume(MYSQL* mysql,const char* sha256);

// flag == FILE_LAST_SEND 将completed_file设置为true，否则保持false
int updateFileInfo(MYSQL *mysql, off_t file_size, const char *sha256,int flag);
#endif